import os
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
import langchain

langchain.debug = True


def llm_call(query: str, instruction) -> str:
    """
    通用模型的调用函数 : 可以定义多个符合业务需要的模型
    1> 模型能够根据用户输入进行语义分析 --> 返回工具信息
    2> 执行工具 (选择带上提示词) --> 调用模型
    """
    try:
        # 模型的参数信息
        api_key = os.getenv('ALIBABA_BAILIAN_API_KEY')
        model = "qwen2.5-14b-instruct"
        base_url = os.getenv('ALIBABA_BAILIAN_API_URL')
        # 定义提示词模板
        prompt_template = ChatPromptTemplate([
            ("system", "{instruction}"),
            ("human", "{query}")
        ])
        # 定义模型
        llm = ChatOpenAI(api_key=api_key,
                         base_url=base_url,
                         model=model,
                         # model_kwargs={
                         #     # "enable_thinking": False,  # 非流式调用必须设为 False
                         #     # "stream": False  # 非流式调用（默认值，显式写出更清晰）
                         #     "temperature": 0.7,  # 控制输出随机性（0~1，值越小越确定）
                         # }
                         verbose=False)  # , verbose=True
        # 定义可执行的链
        chain = ({
                     "instruction": RunnablePassthrough(),
                     "query": RunnablePassthrough()
                 }
                 | prompt_template
                 | llm)
        # 执行链
        response = chain.invoke({
            "instruction": instruction,
            "query": query
        })
        # 获取 AIMessage的 content内容
        llm_out = response.content
        return llm_out
    except Exception as e:
        return f"模型调用失败: {str(e)}"
